iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
Mobile Development

30天React Native之旅:從入門到活用系列 第 30

Day 30:Fastlane 自動化打包與發布

  • 分享至 

  • xImage
  •  

Fastlane簡介

什麼是 Fastlane?

Fastlane 是一套用ruby編寫的自動化工具集,為 iOS 和 Android 開發設計,旨在自動化處理許多繁瑣且重複的任務,如生成屏幕截圖、處理授權文件 (provisioning profiles) 以及打包、發布應用程序。

為什麼要用Fastlane?

我們開發跨平台APP時候,每次的打包都有點麻煩(尤其iOS),需要在各自平台打包、上傳,還需要管理憑證,這一連串的手動操作不僅耗時,不小心還可能出錯。

我們身為軟體工程師,面對這種重複且機械化的工作,就是想要把它自動化!除了省事以外,自動化還更能確保每次的打包和發布都依循固定的流程和標準,減少人為操作的失誤,並提升工作效率。

開始使用Fastlane

  • 環境需求

    • Ruby: Fastlane是使用Ruby編寫的,所以無論iOS還是Android,你都需要Ruby環境。
    • Xcode Command Line Tools (iOS)
    • Gradle (Android): Android的打包和構建工具。
    • Java Development Kit (JDK) (Android)
    • Android SDK & build tools (Android)

    基本上,如果你在建立React Native時已經配置好iOS和Android的環境,那麼上述的需求你大部分都已經有了,不太需要再處理。

  • 安裝Fastlane
    我們用Homebrew 來安裝 Fastlane:

    brew install fastlane
    
  • 初始化
    進入專案中的 ios 資料夾(這裡用ios當範例),執行初始化指令

    fastlane init
    

    在初始化過程中,會有幾個設置選項,你可以根據自己的需求選擇。
    若選擇與 App Store 相關的選項,例如TestFlight或App Store,系統會提示你輸入Apple開發者帳號和密碼。只需按照提示進行即可。

認識Fastlane文件

上述初始化完成後,會在ios資料夾中生成一個fastlane資料夾,裡面會有一些配置文件:

  • Fastfile:fastlane的主配置文件,所有的自動化腳本都是在這裡撰寫。
  • Appfile:一些關於你APP的基本資訊,例如Apple ID和bundle identifier。
  • Deliverfile: deliver 工具相關的配置文件。deliver 是 fastlane 的一個功能,用於將屏幕截圖等自動上傳到 App Store Connect,我們可以在這裡做一些配置。

腳本撰寫基本知識

在撰寫 Fastlane 腳本之前,我們先了解Fastlane的幾個基本概念。

  • Lane
    Lane 在 Fastlane 中代表一個自動化的流程或工作流。由一系列指令或行動(action)組成的,描述了自動化任務的每一步。

    lane :beta do
      # 使用 action 打包app
      build_app 
    end
    

    輸入 fastlane beta 命令,就會依照 :beta lane 裡的指令順序執行。

  • Action
    Action 是 Fastlane 自動化的基礎。每一個 action 都是一個具體的任務或操作,例如:打包、發佈到測試平台、上傳到 App Store 等。Fastlane 提供了許多內建的 actions,當然你也可以根據需求自定義 action。

    在前面的例子中,build_app 就是一個內建的 action。
    所有內建action列表

  • Action的參數
    大部分的 actions 都提供參數選項,讓你更細的控制行為。有些參數是必需的,而有些則是可選的。

    build_app(scheme: "MyApp", workspace: "MyApp.xcworkspace")
    

    例如在這裡,我們使用 build_app action 並提供了 scheme 和 workspace 兩個參數。

    若要查看某個 action 有哪些支持的參數,可以使用以下命令:

    fastlane action [actionName]
    

IOS自動化操作範例

  • Fastlane 腳本範例:打包 iOS 並輸出 .ipa 檔

      # 設定預設的平台為 iOS
      default_platform(:ios)
    
      platform :ios do
          # 定義一個新的lane,名為beta。
          lane :beta do
            # 使用build_app action打包APP。
    
            # scheme: 你的scheme名稱。
            # workspace: Xcode工作區的路徑。
            build_app(
              scheme: "rnDemo",
              workspace: "rnDemo.xcworkspace",
              include_bitcode: true,
    
              # provisioningProfiles是一個物件,鍵是App的Bundle Identifier,值是Profile的名稱。
              export_options: {
                provisioningProfiles: {
                  "com.rnhello" => "com.rnhello"
                }
              }
            )
          end
      end
    

    執行以下指令,開始打包流程:

    fastlane beta
    

    如果default_platform沒有設定 iOS 為預設平台,則需要在指令中明確指出,像這樣:

    fastlane ios beta
    

    打包完成後就會在目錄下看到.ipa檔

  • 增加描述和一些細項的指定,並在打包完後,上傳到TestFlight

    default_platform(:ios)
    
    platform :ios do
        desc "Build and upload to TestFlight"
        lane :smartowon do
            build_app(
                # 在開始建置前,先清理舊的編譯檔案
                clean: true,
                # 指定 IPA 的輸出目錄
                output_directory: './fastlane/release',
                # 指定 IPA 輸出的檔案名稱
                output_name: 'helloRN.ipa',
                # 指定 Xcode 中的 scheme 名稱
                scheme: "rnDemo",
                # 指定建置設定,通常是 'Debug' 或 'Release'
                configuration: 'Release',
                # 是否包含 bitcode
                include_bitcode: false,
                # 指定 IPA 的輸出方式,例如 'app-store', 'ad-hoc', 'enterprise', 'development' 等
                export_method: 'app-store',
                # 附加到 xcodebuild 命令的參數
                export_xcargs: '-allowProvisioningUpdates'
                # '-allowProvisioningUpdates' 允許 xcodebuild 自動處理配置文件。
            )
    
            # 打包完成時,在 macOS 的通知中心顯示通知
            notification(
                title: 'Manager',
                subtitle: 'Build successful. Preparing for upload...',
                message: 'Uploading IPA...'
            )
    
            # 配置用於與 App Store Connect 通信的 API 金鑰
            api_key = app_store_connect_api_key(
                # 從 Apple Developer 網站獲得的 Key ID
                key_id: '',
                # 從 Apple Developer 網站獲得的 Issuer ID
                issuer_id: '',
                # API 金鑰的路徑,通常是一個 .p8 文件
                key_filepath: '',
                # 金鑰的有效期限,以秒為單位
                duration: 1200
            )
    
            # 將已經打包的 IPA 文件上傳到 TestFlight
            upload_to_testflight(
                # 使用上面配置的 API 金鑰
                api_key: api_key,
                # 在 App Store Connect 上跳過等待建置處理的步驟
                skip_waiting_for_build_processing: true,
                # 指定要上傳的 IPA 文件的路徑
                ipa: './fastlane/release/helloRN.ipa',
                # 跳過最後的審核提交步驟,只做上傳動作
                skip_submission: true
            )
    
            notification(
                title: 'Manager',
                subtitle: 'Upload to TestFlight successful',
                message: 'Automation complete!'
            )
        end
    end
    

    有些人可能不知道XCode中scheme怎麼看,其實就是上方的這個
    https://ithelp.ithome.com.tw/upload/images/20231015/20103365z2BDNkLhFP.png

Android自動化操作範例

  • 初始化
    android目錄下執行

    fastlane init
    
  • 前置作業
    在使用下面的Google Store上傳自動化流程之前,請先完成配置 Google 帳戶和金鑰。
    詳情可以參考:fastlane android setup

  • Fastlane 腳本範例:打包和上傳至 Google Play Store

    platform :android do
      desc "自動化建構和上傳Android APK"
    
      lane :build_and_upload do
    
        # 使用gradle來建構Release版本的APK
        gradle(
          task: 'assemble',
          build_type: 'Release'
        )
    
        # 上傳到Google Play Store(
        upload_to_play_store(
          track: 'alpha',  # 您可以選擇不同的track,如alpha、beta或production
          json_key: './path/to/your/google-api-key.json',  # Google Play的API憑證路徑
          package_name: 'com.your.app.package.name'
        )
      end
    end
    
  • 執行腳本

    fastlane android build_and_upload
    

一個指令打包iOS和Android

因為React Native跨平台的特性,我們的fastlane會在ios 和 android 各自的資料夾下,如果要打包兩個平台時,分別輸入各自的命令還是有點麻煩。想要更簡化的話,我們可以直接在package.json的scripts設置指令

例如:

"scripts": {
    "build-ios": "cd ios && fastlane build_ios",
    "build-android": "cd android && fastlane build_android",
    "build-all": "npm run build-ios && npm run build-android"
}

接下來,只需輸入下面的命令,就可以自動化iOS和Android的打包:

npm run build-all

小結

Fastlane能玩的東西還有很多,除了內建功能,還有眾多插件可以使用。大家可以依照自己的需求設計出屬於你或你的團隊的自動化部署流程。如有興趣,可以進一步參閱fastlane文檔和探索它的可用插件

Ref

https://www.jianshu.com/p/4f63e8c26af8
https://docs.fastlane.tools/


上一篇
Day 29:iOS 與 Android 的發布
系列文
30天React Native之旅:從入門到活用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言